package com.zcyr.util;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @author ZCYR
 */
public class ResultSetTool {

    /**
     * 将metadata的数据提取到hashmap
     * @author Tyiorey
     * @param metaData 结果集的metadata
     * @return hashmap
     */
    public static HashMap<String, Object> getMetaData(ResultSetMetaData metaData) {

         // 1 定义列的属性变量
         // 2 获取列的每个属性数据，并保存到 hashItem
         // 3 保存列属性（hashItem）到数组fields中
         // 4 数组fields保存到另一个hashMap中，("fields", fields)

        int columnCount; //结果集中的列数
        HashMap<String, Object> hashMap = new HashMap<>();
        try {
            //获取列数
            columnCount = metaData.getColumnCount();
            //get ResultSetMetaData 中的数据，能获取到的，全部放进去
            List<HashMap<String, Object>> fields= new ArrayList<>();
            //以下数组定义是列的所有属性值
            int columnType;
            String columnClassName;
            String catalogName;
            String columnLabel;
            int columnDisplaySize;
            String columnName;
            String columnTypeName;
            int precision;
            int scale;
            String schemaName;
            String tableName;

            //获取列的属性，并保存
            for(int i=0; i < columnCount; i++){
                HashMap<String, Object> hashItem = new HashMap<>();
                columnType = metaData.getColumnType(i + 1);
                columnClassName = metaData.getColumnClassName(i+1);
                catalogName = metaData.getCatalogName(i+1);
                columnLabel = metaData.getColumnLabel(i+1);
                columnDisplaySize = metaData.getColumnDisplaySize(i +1);
                columnName = metaData.getColumnName(i+1);
                columnTypeName = metaData.getColumnTypeName(i+1);
                precision = metaData.getPrecision(i+1);
                scale = metaData.getScale(i+1);
                schemaName = metaData.getSchemaName(i+1);
                tableName = metaData.getTableName(i+1);
                hashItem.put("columnType",columnType);
                hashItem.put("columnClassName",columnClassName);
                hashItem.put("catalogName",catalogName);
                hashItem.put("columnLabel",columnLabel);
                hashItem.put("columnDisplaySize",columnDisplaySize);
                hashItem.put("columnName",columnName);
                hashItem.put("columnTypeName",columnTypeName);
                hashItem.put("precision",precision);
                hashItem.put("scale",scale);
                hashItem.put("schemaName",schemaName);
                hashItem.put("tableName",tableName);
                fields.add(hashItem);
            }
            hashMap.put("fields", fields);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return hashMap;
    }

    /**
     * 将结果集的所有结果提取到list
     * @author Tyiorey
     *
     * @param resultSet 结果集
     * @return 存放了所有结果的list
     */
    public static ArrayList<HashMap<String, String>> getAllData(ResultSet resultSet) throws SQLException {

        //    1 获取ResultSetMetaData
        //    2 获取列数
        //    3 提取数据
        //    1 第一层循环， 循环行数
        //    将HashMap数据转成Json格式，然后保存到List中
        //    2 第二层循环， 循环列数
        //    将提取到的数据保存到HashMap中（String , Object）
        //    4 返回数据List
        ArrayList<HashMap<String, String>> list =new ArrayList<>();
        String columnData; //列的数据
        ArrayList<String> columnName = new ArrayList<>(); //列的别名
        //获取列样式
        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
        //列的个数
        int columnCount = resultSetMetaData.getColumnCount();

        //获取列的别名数组
        for (int i=1; i<=columnCount;i++) {
            columnName.add(resultSetMetaData.getColumnName(i));
        }
        //循环行数
        while (resultSet.next()){
            //用于保存当前列的数据
            HashMap<String, String> item = new HashMap<>();
            //循环列数
            for(int i=0; i<columnCount; i++){
                //获取当前列的数据
                columnData = resultSet.getString(i + 1);
                //保存列数据
                item.put(columnName.get(i), columnData);
            }
            list.add(item);
        }
        return list;
    }
}
